package middleware

import (
	"gitee.com/war2001/NiuMaEasyGo/nm_core/tenant"
	"github.com/gin-gonic/gin"
)

// TenantMiddleware 多租户中间件
type TenantMiddleware struct {
	tenantManager *tenant.TenantManager
}

// NewTenantMiddleware 创建多租户中间件实例
func NewTenantMiddleware(tenantManager *tenant.TenantManager) *TenantMiddleware {
	return &TenantMiddleware{
		tenantManager: tenantManager,
	}
}

// TenantHandler 租户解析处理中间件
func (m *TenantMiddleware) TenantHandler() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求中解析租户ID
		tenantID := m.resolveTenantID(c)
		if tenantID != "" {
			// 设置租户上下文
			ctx := m.tenantManager.SetCurrentTenant(c.Request.Context(), tenantID)
			c.Request = c.Request.WithContext(ctx)
		}
		c.Next()
	}
}

// 从请求中解析租户ID
func (m *TenantMiddleware) resolveTenantID(c *gin.Context) string {
	// 尝试从请求头获取
	tenantID := c.GetHeader("X-Tenant-ID")
	if tenantID != "" {
		return tenantID
	}

	// 尝试从查询参数获取
	tenantID = c.Query("tenant_id")
	if tenantID != "" {
		return tenantID
	}

	// 尝试从子域名获取
	// TODO: 从子域名解析租户ID

	// 尝试从JWT令牌获取
	// TODO: 从JWT令牌中解析租户ID

	return ""
}

// TODO: 实现租户验证
// TODO: 实现租户资源限制
// TODO: 实现租户请求计数
// TODO: 实现租户访问日志
